package com.wsoft.bpm.service;

import com.wsoft.bpm.query.mapping.ExtraBusinessDataQuery;
import com.wsoft.bpm.query.run.AddSignQuery;
import com.wsoft.bpm.query.run.AgreeQuery;
import com.wsoft.bpm.query.run.TaskHistoryQuery;
import com.wsoft.bpm.vo.*;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.task.Task;

import java.util.List;
import java.util.Map;

/**
 * 运行时服务
 *
 * @Author zhonglj
 * @Date 2024-08-28 14:14
 */
public interface RunProcessService {
    /**
     * 开启工作流
     *
     * @param processDefinitionKey 流程定义唯一键
     * @param tableName            对应数据表名
     * @param businessKey          业务数据唯一键
     * @param extraData            额外的前端参数
     * @param map                  自定义工作流流程参数
     * @return string
     * @author zhonglj
     * @date 2024-09-19 16:04
     **/
    String startProcess(String processDefinitionKey, String tableName, String businessKey, ExtraBusinessDataQuery extraData, Map map);

    /**
     * 开启工作流
     *
     * @param processDefinitionKey 流程定义唯一键
     * @param tableName            对应数据表名
     * @param businessKeyColumn    业务数据唯一键字段名
     * @param businessKey          业务数据唯一键
     * @param statusColumn         业务数据工作流状态字段名
     * @param extraData            额外的前端参数
     * @param map                  自定义工作流流程参数
     * @return string
     * @author zhonglj
     * @date 2024-09-19 16:04
     **/
    String startProcess(String processDefinitionKey, String tableName, String businessKeyColumn, String businessKey, String statusColumn, ExtraBusinessDataQuery extraData, Map map);

    /**
     * 流程简单同意
     *
     * @param taskId
     * @param comment
     * @return org.activiti.engine.task.Task
     * @author zhonglj
     * @date 2024-11-04 10:00
     **/
    Task simpleAgree(String taskId, String comment);

    /**
     * 带参数同意
     *
     * @param query
     * @return void
     * @author zhonglj
     * @date 2024/12/3 11:14
     **/
    void agree(AgreeQuery query);

    /**
     * 拒绝
     *
     * @param taskId
     * @param comment
     * @param authCheck
     * @return void
     * @author zhonglj
     * @date 2024-10-08 15:49
     **/
    void refuse(String taskId, String comment, boolean authCheck);

    /**
     * 退回上一审批节点
     *
     * @param taskId
     * @param comment
     * @return void
     * @author zhonglj
     * @date 2024-10-08 15:49
     **/
    void backOne(String taskId, String comment);

    /**
     * 退回上一审批节点
     *
     * @param taskId
     * @param comment
     * @param authCheck
     * @return void
     * @author zhonglj
     * @date 2024-10-08 15:49
     **/
    void backOne(String taskId, String comment, boolean authCheck);

    /**
     * 动态设置节点负责人
     *
     * @param taskId
     * @param assignee
     * @return void
     * @author zhonglj
     * @date 2024-10-08 16:01
     **/
    void setAssign(String taskId, String assignee);

    /**
     * 查询审批历史
     *
     * @param query
     * @return TaskHistoryVO
     * @author zhonglj
     * @date 2024-10-08 16:03
     **/
    List<TaskHistoryVO> history(TaskHistoryQuery query);

    /**
     * 退回到提交人
     *
     * @param taskId
     * @param comment
     * @return void
     * @author zhonglj
     * @date 2024-10-08 16:19
     **/
    void rollback(String taskId, String comment);

    /**
     * 退回到提交人
     *
     * @param taskId
     * @param comment
     * @param authCheck
     * @return void
     * @author zhonglj
     * @date 2024-10-08 16:19
     **/
    void rollback(String taskId, String comment, boolean authCheck);

    /**
     * 查询待办列表
     *
     * @param
     * @return java.util.List<Task>
     * @author zhonglj
     * @date 2024-10-09 16:08
     **/
    List<Task> todoList();

    /**
     * 查询已办列表
     *
     * @param
     * @return java.util.List<org.activiti.engine.history.HistoricTaskInstance>
     * @author zhonglj
     * @date 2024-10-09 16:55
     **/
    List<HistoricTaskInstance> doneList();

    /**
     * 强制结束工作流程
     *
     * @param processInstanceId
     * @return void
     * @author zhonglj
     * @date 2024-10-10 13:35
     **/
    void stopProcess(String processInstanceId);

    /**
     * 根据任务id获取节点数据，用于控制页面显示、页面操作等
     *
     * @param taskId
     * @return com.wsoft.bpm.vo.ApprovalNodeDataVO
     * @author zhonglj
     * @date 2024-10-14 9:38
     **/
    ApprovalNodeDataVO getNodeData(String taskId);

    /**
     * 任务加签
     *
     * @param signQuery
     * @return void
     * @author zhonglj
     * @date 2024-11-14 15:19
     **/
    void addSign(AddSignQuery signQuery);

    /**
     * 任务驳回
     *
     * @param taskId
     * @param comment
     * @return void
     * @author zhonglj
     * @date 2024-11-14 15:19
     **/
    void reject(String taskId, String comment);

    /**
     * 获取用户任务
     *
     * @param taskId
     * @param authCheck 是否校验权限
     * @return org.activiti.engine.task.Task
     * @author zhonglj
     * @date 2024-11-06 10:46
     **/
    Task getAuthTask(String taskId, boolean authCheck);

    /**
     * 获取用户任务
     *
     * @param processDefKey 流程定义key
     * @param businessKey   业务编码
     * @param authCheck     是否校验权限
     * @return org.activiti.engine.task.Task
     * @author zhonglj
     * @date 2024-11-06 10:46
     **/
    Task getAuthTask(String processDefKey, String businessKey, boolean authCheck);

    /**
     * 生成当前任务节点流程图片PNG
     *
     * @param taskId
     * @param procInstId
     * @return java.lang.String
     * @author zhonglj
     * @date 2024/11/20 16:02
     **/
    String createXmlAndPngAtNowTask(String taskId, String procInstId);

    /**
     * 退回到指定actId节点
     *
     * @param taskId
     * @param comment
     * @param actId
     * @return void
     * @author zhonglj
     * @date 2024/11/25 17:43
     **/
    void backToAct(String taskId, String comment, String actId);

    /**
     * 接口拾取
     *
     * @param taskId
     * @return void
     * @author zhonglj
     * @date 2024/12/16 14:23
     **/
    void claim(String taskId);

    /**
     * 取消拾取
     *
     * @param taskId
     * @return void
     * @author zhonglj
     * @date 2024/12/16 14:25
     **/
    void unClaim(String taskId);

    /**
     * 用于退回指定节点下拉框
     *
     * @param taskId            任务id
     * @param processInstanceId
     * @return java.util.List<com.wsoft.bpm.vo.TaskHistoryVO>
     * @author zhonglj
     * @date 2024/12/20 16:20
     **/
    List<TaskHistoryVO> listApprovalNodes(String taskId, String processInstanceId);

    List<DeployedDefVO> listDeployedDef();

    List<TaskTodoVO> packageExtraTodoData(List<Task> tasks);

    List<TaskDoneVO> packageExtraDoneData(List<HistoricTaskInstance> tasks);

    /**
     * 调用工作流删除流程之前先完成动态审批任务
     *
     * @param processInstanceId
     * @param deleteReason
     * @return void
     * @author zhonglj
     * @date 2025/3/14 18:40
     **/
    void deleteProcessInstance(String processInstanceId, String deleteReason);
}
